import 'dart:ffi';

import 'package:camera/camera.dart';
import 'package:dio/dio.dart';
import 'package:flutter_wear_app/utils/http_util.dart';
import 'package:hive/hive.dart';

final box = Hive.box('myBox');

/// 相机处理类，负责相机的初始化、拍照和关闭操作
class CameraHandler {
  /// 相机控制器，用于控制相机的各种操作
  late CameraController _controller;

  /// 初始化相机控制器的Future，用于等待相机初始化完成
  late Future<void> _initializeControllerFuture;

  /// 初始化相机
  ///
  /// [cameraType] 相机类型，0 表示前置摄像头，1 表示后置摄像头。
  /// 此方法会获取所有可用的相机，并根据 [cameraType] 选择相应的相机进行初始化。
  /// 如果没有找到可用的相机，会抛出异常。
  ///
  /// 返回一个Future，当相机初始化完成时完成。
  Future<void> _initializeCamera(int cameraType) async {
    // 获取所有可用的相机
    final cameras = await availableCameras();
    // 打印摄像头数量
    print('摄像头数量：${cameras.length}');
    // 检查是否有可用的相机
    if (cameras.isEmpty) {
      // 若没有可用相机，抛出异常
      throw Exception('未找到摄像头');
    }

    CameraDescription selectedCamera;
    if (cameraType == 0) {
      // 尝试查找前置摄像头
      selectedCamera = cameras.firstWhere(
        (camera) => camera.lensDirection == CameraLensDirection.front,
        orElse: () => cameras.first,
      );
    } else {
      // 尝试查找后置摄像头
      selectedCamera = cameras.firstWhere(
        (camera) => camera.lensDirection == CameraLensDirection.back,
        orElse: () => cameras.first,
      );
    }
    print('使用的摄像头方向：${selectedCamera.lensDirection}');

    // 初始化相机控制器，使用选定的相机，分辨率预设为中等
    _controller = CameraController(selectedCamera, ResolutionPreset.medium);

    // 开始初始化相机控制器
    _initializeControllerFuture = _controller.initialize();
    // 等待相机初始化完成
    await _initializeControllerFuture;
  }

  /// 拍照
  ///
  /// 此方法会检查相机是否已初始化以及是否正在拍照。
  /// 如果相机未初始化或正在拍照，会抛出异常或返回错误。
  ///
  /// 返回一个Future，包含拍摄的照片文件。
  Future<void> takePicture(type) async {
    await _initializeCamera(type);
    // 检查相机是否已初始化
    if (!_controller.value.isInitialized) {
      // 若相机未初始化，抛出异常
      throw Exception('相机未初始化');
    }

    // 检查相机是否正在拍照
    if (_controller.value.isTakingPicture) {
      // 若正在拍照，返回错误
      return Future.error('正在拍照，请稍后再试');
    }

    try {
      // 等待相机初始化完成
      await _initializeControllerFuture;
      // 拍摄照片
      final image = await _controller.takePicture();
      // 返回拍摄的照片文件
      final file = await MultipartFile.fromFile(image.path);
      print("拍摄成功----------${image.path}");
      // 上传图片
      await _uploadImg(file: file, type: type);
    } catch (e) {
      // 打印拍照时的错误信息
      print('拍照时出错: $e');
      // 重新抛出异常
      rethrow;
    } finally {
      // 关闭相机
      closeCamera();
    }
  }

  /// 关闭相机
  ///
  /// 此方法会释放相机控制器占用的资源。
  ///
  /// 返回一个Future，当相机关闭完成时完成。
  Future<void> closeCamera() async {
    // 释放相机控制器
    await _controller.dispose();
  }

  Future<void> _uploadImg({file, type}) async {
    final Int userId = box.get("userInfo")["id"];
    final res = await HttpUtil.postFile(
      '/remote/takePhotos',
      params: {"file": file, "user_id": userId, "type": type},
    );
    if (res['code'] == 1) {
      print(res['data']);
    } else {
      print(res['msg']);
    }
  }
}
